package estadosDelEnvio;

import envios.Envio;
import exceptions.StatesException;

/**
 * Esta clase representa el estado en forma abstracta que posee
 * un envio.
 * 
 * @author Lucas Alan Silvestri.
 *
 */
public abstract class EstadoDeEnvio {
	
	/**
	 * Cancela el envio recibido por parametro.
	 * @param unEnvio
	 * @throws StatesException
	 */
	public  void cancelarEnvio(Envio unEnvio)throws StatesException{
		unEnvio.cambiarEstado(new Cancelado());
		unEnvio.devolverProductos();
	}
	
	/**
	 * Lanza una StatesExeception indicando que la operacion no puede
	 * ser realizada.
	 * @param unEnvio
	 * @throws StatesException
	 */
	public void enviarEnvio(Envio unEnvio) throws StatesException{
		throw new StatesException("El envio no puede ser enviado en esta "
				+ "etapa del proceso de envio.");
	}
	
	/**
	 * Lanza una StatesExeception indicando que la operacion no puede
	 * ser realizada.
	 * @param unEnvio
	 * @throws StatesException
	 */
	public void entregarEnvio(Envio unEnvio) throws StatesException{
		throw new StatesException("El envio no puede ser entregado en esta "
				+ "etapa del proceso de envio.");
	}
	
	/**
	 * Retorna que el estado actual no se encuentra PendienteDeEnvio.
	 * @return
	 */
	public boolean estoyPendienteDeEnvio(){
		return false;
	}
	
	/**
	 * Retorna que el estado actual no se encuentra EnProcesoDeEnvio.
	 * @return
	 */
	public boolean estoyEnProcesoDeEnvio(){
		return false;
	}
	
	/**
	 * Retorna que el estado actual no se encuentra Cancelado.
	 * @return
	 */
	public boolean estoyCancelado(){
		return false;
	}
	
	/**
	 * Retorna que el estado actual no se encuentra Entregado.
	 * @return
	 */
	public boolean estoyEntregado(){
		return false;
	}
}
